#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File   : b_object_program.py
# @Email  : xuexia_xu@feidee.com
# @Time   : 2024/3/21 13:48
# @Desc   : 私有变量 __init__ dir
"""
面向对象高级编程：

私有变量：实例的变量名如果以__开头，就变成了一个私有变量（private）
dir(): 获得一个对象的所有属性和方法
对实例/类动态绑定 属性/方法
限制实例的属性 __slots__
"""
import sys
from types import MethodType


def fn():
    """
    系统argv参数
    :return:
    """
    args = sys.argv
    if len(args) == 1:
        print('Hello, world!')
    elif len(args) == 2:
        print('Hello, %s!' % args[1])
    else:
        print('Too many arguments!')


class Student:
    """
    私有变量
    """

    def __init__(self, name):
        self.__name = name


class Student_Limitation:
    # 仅对当前类实例起作用，对继承的子类是不起作用的
    __slots__ = ('name', 'age')  # 用tuple定义允许绑定的属性名称


def set_age(self, age):
    self.age = age


def set_score(self, score):
    self.score = score


if __name__ == '__main__':
    fn()
    Amy = Student('Amy')
    print(Amy)
    print(Student)
    print(dir(Amy))

    # 动态绑定
    # 给实例绑定一个属性
    Amy.age = '15'
    # print(dir(Amy))
    # 给实例绑定一个方法
    Amy.set_age = MethodType(set_age, Amy)
    Amy.set_age(25)
    print(Amy.age)
    # 为了给所有实例都绑定方法，可以给class绑定方法
    Student.set_score = set_score
    Amy.set_score(100)
    print(Amy.score)

    # 限制动态绑定
    s = Student_Limitation()
    s.name = 'Michael'
    s.score = 99  # 绑定属性score会报错
